package managerBeanImpl;

import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import managerBean.PacchettoManagerBean;
import model.Carrello;
import model.CarrelloPK;
import model.ComponentiPacchetti;
import model.ComponentiPacchettiPK;
import model.Elemento;
import model.Hotel;
import model.Pacchetto;
import model.UtenteRegistrato;
import model.Volo;
import model.Wishlist;
import model.WishlistPK;

@Stateless
public class PacchettoManagerBeanImpl implements PacchettoManagerBean {

	@PersistenceContext
    private EntityManager em;
	
	@Override
	public List visualizzaPacchettiMgr() {
		Query query=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto<10000");
		return query.getResultList();
	}

	@Override
	public List cercaPacchettiMgr(String cerca) {
		Query query=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto<10000 and p.nome='"+cerca+"'");
		return query.getResultList();
	}
	
	@Override
	public List cercaPacchettiPersMgr(int idPersonalizzato) {
		Query query=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto="+idPersonalizzato);
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"CLIENTE"})
	public void aggiungiAWishlistMgr(int idPacchetto) {
		String username=FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
		Query query=em.createQuery("SELECT u FROM UtenteRegistrato u WHERE u.username='"+username+"'");
		List<UtenteRegistrato> utente= query.getResultList();
		int idWishlist=utente.get(0).getIdWishlist();
		Query query2=em.createQuery("SELECT w FROM Wishlist w WHERE w.id.idWishlist="+idWishlist+" and w.id.idPacchetto="+idPacchetto);
		if (query2.getResultList().isEmpty()){
			Wishlist wishlist=new Wishlist(new WishlistPK(idWishlist,idPacchetto));
			em.persist(wishlist);
		}
	}
	
	@Override
	@RolesAllowed({"CLIENTE"})
	public void aggiungiACarrelloMgr(int idPacchetto) {
		String username=FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
		Query query=em.createQuery("SELECT u FROM UtenteRegistrato u WHERE u.username='"+username+"'");
		List<UtenteRegistrato> utente= query.getResultList();
		int idCarrello=utente.get(0).getIdCarrello();
		Query query2=em.createQuery("SELECT c FROM Carrello c WHERE c.id.idCarrello="+idCarrello+" and c.id.idPacchetto="+idPacchetto);
		if (query2.getResultList().isEmpty()){
			Carrello carrello=new Carrello(new CarrelloPK(idCarrello,idPacchetto));
			em.persist(carrello);
		}
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List visualizzaVoliMgr() {
		Query query=em.createQuery("SELECT v FROM Volo v");
		return query.getResultList();
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List cercaVoliMgr(String cerca) {
		Query query=em.createQuery("SELECT v FROM Volo v WHERE v.luogoPartenza='"+cerca+"'");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void creaPacchettoMgr(String nome, int numeroPersone,int idVoloAndata, int idVoloRitorno) {
		Query query=em.createQuery("SELECT v FROM Volo v WHERE v.id="+idVoloAndata);
		List<Volo> voliAndata=query.getResultList();
		Query query2=em.createQuery("SELECT v FROM Volo v WHERE v.id="+idVoloRitorno);
		List<Volo> voliRitorno=query2.getResultList();
		if (voliAndata.get(0).getData().before(voliRitorno.get(0).getData())){
			Query query3=em.createQuery("SELECT p FROM Pacchetto p WHERE p.idPacchetto=(SELECT max(p1.idPacchetto) FROM Pacchetto p1 WHERE p1.idPacchetto<10000)");
			List<Pacchetto> pacchetti=query3.getResultList();
			int idPacchetto;
			if (pacchetti.isEmpty())
				idPacchetto=1;
			else
				idPacchetto=pacchetti.get(0).getIdPacchetto()+1;
			Query query4=em.createQuery("SELECT e FROM Elemento e WHERE e.idElementoSpecifico="+idVoloAndata+" and e.tipo='VOLO'");
			List<Elemento> elementi=query4.getResultList();
			int idElemento=elementi.get(0).getIdElemento();
			Query query5=em.createQuery("SELECT e FROM Elemento e WHERE e.idElementoSpecifico="+idVoloRitorno+" and e.tipo='VOLO'");
			List<Elemento> elementi2=query5.getResultList();
			int idElemento2=elementi2.get(0).getIdElemento();
			
			Pacchetto pack=new Pacchetto(idPacchetto, voliAndata.get(0).getData(), voliRitorno.get(0).getData(), nome, numeroPersone, voliAndata.get(0).getPrezzo()+voliRitorno.get(0).getPrezzo());
			em.persist(pack);
			
			ComponentiPacchettiPK pk,pk2;
			ComponentiPacchetti comp,comp2;
			pk=new ComponentiPacchettiPK(idPacchetto, idElemento);
			pk2=new ComponentiPacchettiPK(idPacchetto, idElemento2);
			comp=new ComponentiPacchetti(pk, "OBBLIGATORIO");
			comp2=new ComponentiPacchetti(pk2, "OBBLIGATORIO");
			em.persist(comp);
			em.persist(comp2);
		}
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List getVoliPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT v FROM Elemento e,ComponentiPacchetti c,Volo v WHERE e.tipo='VOLO' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=v.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List getHotelPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT h FROM Elemento e,ComponentiPacchetti c, Hotel h WHERE e.tipo='HOTEL' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=h.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List getEscursioniPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("SELECT x FROM Elemento e,ComponentiPacchetti c, Escursione x WHERE e.tipo='ESCURSIONE' and e.idElemento=c.id.idElemento and e.idElementoSpecifico=x.id and c.id.idPacchetto="+idPacchetto);
		return query.getResultList();
	}

	@Override
	public void rimuoviHotelMgr(int idPacchetto, int idHotel) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='HOTEL' and e.idElementoSpecifico="+idHotel+")");
		query.executeUpdate();
	}

	@Override
	public void rimuoviVoloMgr(int idPacchetto, int idVolo) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+idVolo+")");
		query.executeUpdate();
	}

	@Override
	public void rimuoviEscursioneMgr(int idPacchetto, int idEscursione) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto+" and c.id.idElemento=(SELECT e.idElemento FROM Elemento e WHERE e.tipo='ESCURSIONE' and e.idElementoSpecifico="+idEscursione+")");
		query.executeUpdate();
	}
	
	@Override
	public void rimuoviPacchettoMgr(int idPacchetto) {
		Query query=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idPacchetto="+idPacchetto);
		query.executeUpdate();
		Query query2=em.createQuery("DELETE FROM Carrello c WHERE c.id.idPacchetto="+idPacchetto);
		query2.executeUpdate();
		Query query3=em.createQuery("DELETE FROM Wishlist w WHERE w.id.idPacchetto="+idPacchetto);
		query3.executeUpdate();
		Query query4=em.createQuery("DELETE FROM Pacchetto p WHERE p.idPacchetto="+idPacchetto);
		query4.executeUpdate();
		
	}
	
}
